/*   
	Comandos a usar:
	----------------

	telnet 127.0.0.1 8080 
	server-tcp startup.conf
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <assert.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <semaphore.h>

//mis funciones
#include "servicio_conn.c"

#define MSG_ERROR "<html><head><title>Error 404</title></head><body><h2>Error 404</h2>Archivo no encontrado</body></html>"

int main(int argc, char *argv[])
{
	int escuchafd, connfd, fd;
	struct sockaddr_in donde_escucho;
	char buf[1024];					//buffer de lectura del archivo de configuracion
	int n, max_childs, puerto;			//variables del archivo de configuracion

	sem_t * sem;

	//if(argc==1) puts("uso: server-tcp <archivo_configuracion>");
	
	assert(argc==2);

	//Abro el archivo de configuracion 
	if((fd=open("startup.conf",O_RDONLY))==-1) {
		perror("El archivo no existe");		 //si le tiro cualquier fruta
		exit(EXIT_FAILURE);
	}
	n=read(fd,buf,sizeof(buf));
	buf[n]=0;
	sscanf(buf, "%d %d", &max_childs, &puerto); //parseo del archivo de configuracion
	puerto = atoi(argv[1]);
	printf("hijos: %d\n puerto: %d\n\n", max_childs, puerto);

	if((sem=sem_open("/semaforo_child", O_CREAT, 0666, max_childs))==SEM_FAILED)
	{
		perror("sem_open()");
		exit(EXIT_FAILURE);
	}

	escuchafd=socket(PF_INET, SOCK_STREAM, 0);
	donde_escucho.sin_family=AF_INET;
	donde_escucho.sin_port=htons(puerto); 		//htons para no tener problemas con la arquitectura
	donde_escucho.sin_addr.s_addr=htonl(INADDR_ANY); //en cualquiera de mis IPs

	if(bind(escuchafd, (struct sockaddr *)&donde_escucho, sizeof (donde_escucho))==-1) {
		perror("bind()");
		sem_unlink("/semaforo_child");
		exit(EXIT_FAILURE);
	}

	listen(escuchafd, 10);

	while((connfd=accept(escuchafd, NULL, 0))!=-1) {
		fprintf(stderr, "Conexion entrante: ");
		system("date");
		//sem_wait(sem);
		switch(fork()) {
		case -1:
			//sem_unlink("/semaforo_child");
			perror("fork()");
			exit(EXIT_FAILURE);
		case 0:
			servicio_conn(connfd);
			//sem_post(sem);
			_exit(EXIT_SUCCESS);
		}
	
		close(connfd); //cerramos la conexion del padre
	}
	//sem_unlink("/semaforo_child");
	perror("accept()");

	return EXIT_FAILURE;
}
